package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 分类管理
 */
@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {
    @Autowired
    private CategoryService categoryService;

    /**
     * 新增菜品分类功能
     * @param category
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){
        //输出调试日志
        log.info("分类新建功能……");

        //执行 sql 新建insert保存操作
        categoryService.save(category);

        //返回保存信息到前端
        return R.success("分类新建成功");
    }

    /**
     * 调用 mp 分页功能进行分页查询
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize){
        //输出调试日志
        log.info("分类分页功能……");

        //创建分页构造器
        Page<Category> pageInfo = new Page<>(page,pageSize);

        //创建 wrapper 包装类封装查询条件
        LambdaQueryWrapper<Category> lambdaQueryWrapper = new LambdaQueryWrapper();
        //根据 sort 字段进行升序得查询
        lambdaQueryWrapper.orderByAsc(Category::getSort);

        //执行查询条件
        categoryService.page(pageInfo,lambdaQueryWrapper);

        //返回数据给前端，通过 element ui 组件进行分页得展示
        return R.success(pageInfo);
    }

    /**
     * 根据 id 进行删除分类，还需要进行判断当前删除的是否关联其他表
     * @param ids  页面的请求 id 参数
     * @return
     */
    @DeleteMapping()
    public R<String> delete(Long ids){
        //输出日志
        log.info("分类删除功能……id:{}",ids);

        //进行 sql 语句删除操作
//        categoryService.removeById(ids);
        //自己写的方法
        categoryService.remove(ids);

        //返回数据到前端
        return R.success("删除成功");
    }

    /**
     * 分类的编辑功能，回显操作直接通过前端操作，
     * 如果，回显的数据页面有的话，可以直接通过前端进行回显，没有的话，需要我们后端通过服务器访问数据库进行传递数据到前端进行回显
     * @param category
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody Category category){
        //输出调试日志
        log.info("分类更新功能……参数:{}",category.toString());

        //进行 sql 的更新操作
        categoryService.updateById(category);

        //返回更新信息
        return R.success("修改成功");
    }


    /**
     * 添加菜品页面查询其分类的数据，返回 list 可供选择的所有分类
     * 就是子类表查询其父类表的信息
     * @param category  这里也可以用 string type，因为页面传递的是 ?type=1，
     *                  但是用实体类的话，直接将type封装到实体属性中，如果后面请求参数不只是 type 的话，实体类优势就体现出来了
     * @return
     */
    @GetMapping("/list")
    public R<List<Category>>  list(Category category){
        //输出调试日志
        log.info("菜品分类……数据：{}",category);

        //1.创建条件构造器
        LambdaQueryWrapper<Category> lambdaQueryWrapper = new LambdaQueryWrapper();
        //进行设置子表 dish 对 父表 category 的查询条件
        //type = 1,是菜品的分类，2是套餐
        lambdaQueryWrapper.eq(category.getType() != null,Category::getType,category.getType());
        //添加排序的条件
        //先通过 sort 升序，然后通过 更新时间进行在同级的 sort里面 降序
        lambdaQueryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);

        //2.执行查询语句，返回 list 集合
        List<Category> list = categoryService.list(lambdaQueryWrapper);

        //3.返回 list 集合到前端进行展示
        return R.success(list);
    }
}
